package com.zhentao.pojo;

import lombok.Data;

import java.io.Serializable;

/**
 * 统一响应结果类
 * 作用：封装接口返回的状态码、消息和数据，简化前端对接
 * 适用场景：所有Controller的接口返回都用这个类封装
 */
@Data
public class R<T> implements Serializable {

    // 状态码（200=成功，500=失败，可扩展其他业务码）
    private Integer code;

    // 响应消息（成功/失败描述）
    private String msg;

    // 响应数据（泛型支持任意类型）
    private T data;

    // ====================== 常用静态方法 ======================
    /**
     * 成功响应（无数据）
     */
    public static <T> R<T> ok() {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMsg("操作成功");
        return r;
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> R<T> ok(T data) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMsg("操作成功");
        r.setData(data);
        return r;
    }

    /**
     * 失败响应（自定义消息）
     */
    public static <T> R<T> failed(String msg) {
        R<T> r = new R<>();
        r.setCode(500);
        r.setMsg(msg);
        return r;
    }

    /**
     * 失败响应（自定义状态码和消息）
     * 扩展：比如 401=未授权，403=权限不足
     */
    public static <T> R<T> failed(Integer code, String msg) {
        R<T> r = new R<>();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

    /**
     * 失败响应（自定义消息）- error方法的别名
     */
    public static <T> R<T> error(String msg) {
        return failed(msg);
    }

    /**
     * 失败响应（自定义状态码和消息）- error方法的别名
     */
    public static <T> R<T> error(Integer code, String msg) {
        return failed(code, msg);
    }
}
